﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Client.TopLevel
{
    /// <summary> Базовый интерфейс; общий функционал всех систем </summary>
    public interface ISys
    {
    }

    /// <summary> Система идентификации; фиктивная - служит для создания объекта типа RepositoryManager </summary>
    public interface IIdentificationSys : ISys
    {
        RepositoryManager GetRepositoryManager();
    }

    public interface ILoginSys : ISys
    {
        /// <summary> Регистрация появления сотрудника на работе </summary>
        bool LogIn();

        /// <summary> Регистрация ухода сотрудника с работы </summary>
        bool LogOut();
    }

    /// <summary> Система работы с персоналом </summary>
    public interface IPersonnelSys : ISys
    {
        #region Employee Area

        /// <summary> Получение данных о текущем сотруднике </summary>
        TLEmployee GetEmployee();

        /// <summary> Завершение выполнения задачи </summary>
        bool FinishTash(TLTask task);

        #endregion

        #region Manager Area

        /// <summary> Добавление нового сотрудника в систему (только для менеджеров) </summary>
        bool AddEmployee(TLEmployee employee);

        /// <summary> Редактирование сотрудника (только для менеджеров) </summary>
        bool EditEmployee(TLEmployee oldEmployee, TLEmployee newEmployee);

        /// <summary> Удаление сотрудника (только для менеджеров) </summary>
        bool DeleteEmployee(TLEmployee employee);

        /// <summary> Получение коллекции всех сотрудников (только для менеджеров) </summary>
        IEnumerable<TLEmployee> GetAll();  

        /// <summary> Добавление новой задачи в систему (только для менеджеров) </summary>
        bool AddTask(TLTask task);

        /// <summary> Удаление задачи из системы (только для менеджеров) </summary>
        bool DeleteTask(TLTask task);

        /// <summary> Редактирование задачи (только для менеджеров) </summary>
        bool EditTask(TLTask oldTask, TLTask newTask);

        /// <summary> Закрытие задачи (только для менеджеров) </summary>
        bool CloseTask(TLTask task);

        /// <summary> Все задачи (только для менеджеров) </summary>
        IEnumerable<TLTask> GetAllTasks();

        #endregion
    }

    /// <summary> Система построения отчетов; отчет - это информация о сотруднике плюс отработанное время </summary>
    public interface IReportSys : ISys
    {
        #region Employee Area

        /// <summary> Получение отчета по текущему сотруднику </summary>
        TLReport Get();

        #endregion

        #region Manager Area

        /// <summary> Получение отчетов по всем сотрудникам (только для менеджеров) </summary>
        IEnumerable<TLReport> GetAll();

        #endregion
    }

    /// <summary> Система построения отчетов; отчет - это информация о сотруднике плюс отработанное время </summary>
    public interface ISalarySys : ISys
    {
        #region Employee Area

        /// <summary> Просмотр зарплаты текущего сотрудника за выбранный период </summary>
        int Get(DateTime startTime, DateTime endTime);

        #endregion

        #region Manager Area

        /// <summary> Начисление зарплаты за выбранный период сотрднику (только для менеджеров) </summary>
        bool Pay(TLEmployee user, DateTime startTime, DateTime endTime);

        /// <summary> Начисление зарплаты за выбранный период всем сотрдникам (только для менеджеров) </summary>
        bool PayAll(DateTime startTime, DateTime endTime);

        #endregion
    }
}
